home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / docs / ippon / ver / 050 / shot.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  2KB  |  86 lines

  1. /* shot.c */
  2.  
  3. #include <stdio.h>
  4. #include <xsp2lib.h>
  5.  
  6. #include "main.h"
  7. #include "player.h"
  8. #include "enemy.h"
  9. #include "shot.h"
  10. #include "sound.h"
  11.  
  12.  
  13. #define PALET_SHOT        0x0800
  14.  
  15. #define SHOT_SPEED    31
  16.  
  17. static SHOT _shot;        /* ワーク */
  18.  
  19.  
  20. /* ゲーム開始時に呼ばれる */
  21. void ShotInit (void)
  22. {
  23.     shot = &_shot;
  24.     shot->status = SHOT_STATUS_NON;
  25. }
  26.  
  27.  
  28.  
  29. /* ショット出現時に呼ばれる */
  30. void ShotAlloc (void)
  31. {
  32.     SHOT *p = shot;
  33.     if (p->status == SHOT_STATUS_FLY)
  34.         return;
  35.  
  36.     p->lx = (player->x) << 16;    /* ショットの座標は自機+(0,-16) */
  37.     p->ly = (player->y + 4) << 16;    /* 自機の少し上に出す */
  38.     p->pt = obj_shot;
  39.     p->info = PALET_SHOT | PRIORITY_SHOT;
  40.     p->vx = xytable[SHOT_SPEED][192].x;
  41.     p->vy = xytable[SHOT_SPEED][192].y;
  42.     p->hit_x = 3;
  43.     p->hit_y = 8;
  44.     p->erase_flag = 0;
  45.     p->enemy = NULL;
  46.     p->shot_count = 0;
  47.     p->status = SHOT_STATUS_FLY;
  48.  
  49.     SoundSetSE (SE_SHOT);    /* ショット発射音 */
  50. }
  51.  
  52.  
  53.  
  54. /* 垂直同期ごとに呼ばれる */
  55. void ShotMove (void)
  56. {
  57.     SHOT *p = shot;
  58.  
  59.     switch (p->status) {
  60.     case SHOT_STATUS_NON:
  61.         break;
  62.  
  63.     case SHOT_STATUS_FLY:
  64.         /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  65.         p->x = (p->lx += p->vx) >> 16;
  66.         p->y = (p->ly += p->vy) >> 16;
  67.  
  68.         /* ショットが画面外に出たか? */
  69.         /* (画面右から出た判定と左から出た判定を1回の比較で行っている事に注目) */
  70.         if (((unsigned short) (p->x) > 256 + 16)
  71.             || ((unsigned short) (p->y) > 256 + 16)) {
  72.             p->status = SHOT_STATUS_NON;
  73.         } else {
  74.             xobj_set_st (p);
  75.         }
  76.         break;
  77.  
  78.     case SHOT_STATUS_STICK:
  79.         p->x = ((p->lx = p->enemy->lx) >> 16) + p->off_x;
  80.         p->y = ((p->ly = p->enemy->ly) >> 16) + p->off_y;
  81.         xobj_set_st (p);
  82.         break;
  83.     }
  84.  
  85. }
  86.